#include<iostream>
#include "TStack.h"


template<class T> TStack<T>::TStack()
{
  this->length = 20;//dimensiunea implicita a stivei;
  this->t = new T[this->length];/*t este un pointer spre primul element din zona de memorie 
                            de unde incepe sa fie memorata stiva;
                            operatorul new permite alocarea unei zone de memorie pentru 
                            dim de obiecte de tip T;
                            new returneaza un pointer de unde incepe aceasta adresa de memorie*/
  this->ind = -1;//la constructie
  std::cout<<"S-a apelat constructorul implicit!";//afisare mesaj de confirmare
}

template<class T> TStack<T>::TStack(int length)
{
  this->length = length;/*dimensiunea stivei va fi initializata cu argumentul transmis ca
                          parametru constructorului*/
  this->t = new T[length];
  this->ind = -1;
}

template<class T> TStack<T>::~TStack()
{
  delete [] t;
  std::cout<<"\nStiva a fost distrusa!\n";
}

template<class T> void TStack<T>::add(T element)
{
  if(this->full())
    std::cout<<"\nStiva este plina!";  
    else
    {
      ++ind;
      t[ind] = element;
    }
}

template<class T> void TStack<T>::list()
{
  if(this->empty())
    std::cout<<"\nLista este vida!";
    else
    {
      std::cout<<"\nElemente stivei sunt:";
      for(int i = this->ind; i >= 0; i--)
        std::cout<<"\n "<<t[i];
    }
}

template<class T> bool TStack<T>::empty()
{
  if(this->ind == 0)
    return true;
    else 
      return false;
}

template<class T> bool TStack<T>::full()
{
  if(this->ind == this->length)
    return true;
    else
      return false;
}

